#include "blockqueue.hpp"
#include <pthread.h>
#include "task.hpp"
//生产者消费者模型为什么能提高效率，我们可以看到所有的生产者和消费者线程都是互斥的，也就是说都是串行工作的，那么哪来的提高效率一说呢？
//事实上我们的生产者消费者模型并不处理任务，生产者负责获取任务。消费者负责拿走阻塞队列中的任务，到这就已经脱离了生产者消费者模型。任务的处理是在每一个消费者自行处理的，并不会占用锁。所以在消费者线程处理任务时，生产者也在并行的获取任务到阻塞队列中。
int x=0;
int y=1;
void *producter(void *args)
{
    blockqueue<task>* bq=(blockqueue<task>*)args;   
    while(1)
    {
        sleep(1);
        x++;
        y++;
        task tk(x,y);
        cout<<"派发了一个任务: "<<tk.x()<<" + "<<tk.y()<<endl;
        bq->push(tk);
    }
    return nullptr;
}

void *consumer(void *args)
{
    
    blockqueue<task>* bq=(blockqueue<task>*)args;
    while(1)
    {
        task tk=bq->pop();//这就是获得任务的，任务获得之后就将锁释放了，后面的执行时不占用锁的。
        tk.excute();
        cout<<"完成了一个任务: "<<tk.result()<<endl;
        cout<<endl;
    }
    return nullptr;
}
int main()
{
    blockqueue<task> *bq = new blockqueue<task>(); // 创建阻塞队列

    pthread_t c[2], p[3];   
    for(int i=0;i<1;i++)                 // 生产者和消费者线程
        pthread_create(&p[i], nullptr, producter, bq);
    for(int i=0;i<1;i++)
        pthread_create(&c[i], nullptr, consumer, bq);
    sleep(10);

    for(int i=0;i<3;i++)
        pthread_cancel(p[i]);
    for(int i=0;i<2;i++)
        pthread_cancel(c[i]);
    return 0;
}